#include "includes.h" 

#define READword(address)     ((unsigned int)(*(volatile unsigned int *__near)(address)))

#define DFLASH_LOWEST_START_PAGE        0x00        //定义data flash的起始页
#define DFLASH_START                    0x00100000  //定义data flash的起始地址
#define DFLASH_PAGE_SIZE                0x0400      //定义data flash的大小为1K.
#define DFLASH_PAGE_WINDOW_START        0x0800      //定义data flash页面窗口的起始地址

unsigned int    Buffer[4]={0};   //数据缓存区，只能一次写入四个数据    //16bit
unsigned int    data_Address=0x1000;
//unsigned int    date_read[4];
unsigned int  rorw;
unsigned int ss;
float  spp,sdd;

/*************************************************************/
/*                      初始化DFLASH                         */
/*************************************************************/
void DFlash_Init(void)
{
   while(FSTAT_CCIF==0);            //等待正在处理的FLASH操作完成
   FCLKDIV=0x0F;                    //外部晶振为16M.FLASH时钟不超过1M，具体参照手册
   FCNFG=0x00;                      //禁止中断
   while(FCLKDIV_FDIVLD==0);        //等待时钟设置成功
}

/*************************************************************/
/*                     向DFLASH写入数据                      */
/*************************************************************/
void DFlash_Write(word ADDR16)
{
    while(FSTAT_CCIF==0); 
    if(FSTAT_ACCERR)           //判断并清除标志位；
        FSTAT_ACCERR=1;
    if(FSTAT_FPVIOL)           //判断并清除标志位；
        FSTAT_FPVIOL=1;
    FCCOBIX_CCOBIX=0x00; 
    FCCOB=0x1110;         //写入命令和高位地址
    FCCOBIX_CCOBIX=0x01;  //地址后16位
    FCCOB=ADDR16;         //写入低16位地址 
    FCCOBIX_CCOBIX=0x02;  //写入第一个数据
    FCCOB=Buffer[0];
    FCCOBIX_CCOBIX=0x03;  //写入第二个数据
    FCCOB=Buffer[1];
    FCCOBIX_CCOBIX=0x04;  //写入第三个数据
    FCCOB=Buffer[2];
    FCCOBIX_CCOBIX=0x05;  //写入第四个数据
    FCCOB=Buffer[3];  
  
      
    FSTAT_CCIF=1;         //写入执行命令
    while(FSTAT_CCIF==0); //等待执行完毕
}

/*************************************************************/
/*                     由DFLASH读取数据                      */
/*************************************************************/
word DFlash_Read (word destination)
{
    byte   lastepage;          //用于存储EPAGE的值
    byte   epage;              //用于计算EPAGE的值
    unsigned int data;         //读取出的数据

    lastepage = EPAGE;   //保存EPAGE的值

    epage = (byte)((DFLASH_LOWEST_START_PAGE)+(destination >>10));   //计算EPAGE
    EPAGE=epage;                                                     //给EPAGE赋值
 
    data = READword((destination & (DFLASH_PAGE_SIZE - 1)) + DFLASH_PAGE_WINDOW_START);  //读取页面窗口中的数据

    EPAGE= lastepage;       //恢复EPAGE的值

    return(data);
}

/*************************************************************/
/*                    擦除DFLASH的一个分区                   */
/*************************************************************/
void DFlash_Erase(word ADDR16)
{   
  while(FSTAT_CCIF==0);
  if(FSTAT_ACCERR)           //判断并清除标志位；
      FSTAT_ACCERR=1;
  if(FSTAT_FPVIOL)           //判断并清除标志位；
      FSTAT_FPVIOL=1;
  
  FCCOBIX_CCOBIX=0x00;
  FCCOB=0x1210;           //写入擦除命令和高位地址
  FCCOBIX_CCOBIX=0x01;   
  FCCOB=ADDR16;           //写入低16位的地址
  FSTAT_CCIF=1;           //启动执行命令
  while(FSTAT_CCIF==0);   //等待执行完成
}

/*************************************************************/
/*                          读写函数                         */
/*************************************************************/
void Read_Write_Flash(void)
{
  red_light=1;
  rorw=DFlash_Read(data_Address); 
  if(rorw==1314) 
  {
    spp=DFlash_Read(data_Address+2)/10.0; 
    sdd=DFlash_Read(data_Address+4)/10.0; 
    ss=DFlash_Read(data_Address+6);  
 //   spp=DFlash_Read(data_Address+16)/10.0; 
  } 
  else 
  {
    spp=3; 
    sdd=6.5; 
    ss=70;
  }                                
  while(key2) 
  { 
     if(switch4) 
     {
       if(switch1&&switch2) 
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
            spp=spp+0.1;
           }
         }
       } 
       if(!switch1&&switch2)
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
             sdd=sdd+0.1;
           }
         }
       }
       if(switch1&&!switch2) 
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
             ss++;
           }
         }  
       }
      /* if(!switch1&&!switch2) 
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
             spp=spp+0.5;
           }
         }  
       } */
     }
     else 
     {
       if(switch1&&switch2) 
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
            spp=spp-0.1;
           }
         }
       } 
       if(!switch1&&switch2)
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
             sdd=sdd-0.1;
           }
         }
       }
       if(switch1&&!switch2) 
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
             ss--;
           }
         }  
       } 
      /* if(!switch1&&!switch2) 
       {
         if(!key1) 
         {
           Delay_ms(120);
           if(!key1) 
           {
             spp=spp-0.5;
           }
         }  
       } */
     }
  OLED_display();
  }  
  
  Buffer[0]=1314; 
  Buffer[1]=(unsigned int)(spp*10);  
  Buffer[2]=(unsigned int)(sdd*10); 
  Buffer[3]=ss; 

  DFlash_Erase(data_Address);     //确保先擦除后写入
  DFlash_Write(data_Address);
    
  red_light=0;       //灭灯
}
/*************************************************************/
/*                           主函数                          */
/*************************************************************/
/*
void main(void)
{
    DisableInterrupts;
    LEDCPU_dir=1;
    LEDCPU=1;
    EnableInterrupts;
    
    DFlash_Init();                  //初始化Flash
    DFlash_Erase(data_Address);     //确保先擦除后写入
    DFlash_Write(data_Address);
    date_read[0]=DFlash_Read(data_Address); 
    date_read[1]=DFlash_Read(data_Address+2); 
    date_read[2]=DFlash_Read(data_Address+4); 
    date_read[3]=DFlash_Read(data_Address+6); 
 
    if(date_read[0]==0x1111&&date_read[1]==0x2222&&date_read[2]==0x3333&&date_read[3]==0x4444)  //判断数据是否正确
        LEDCPU=0;           //点亮指示灯
  for(;;) 
  {
  } 
}      */
